package cn.iocoder.yudao.framework.redis.core.dao;

import cn.iocoder.yudao.framework.redis.core.RedisKeyConstants;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptSimpleDTO;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.time.Duration;
import java.util.List;
import java.util.Random;

/**
 * @Author LiZhiMin
 * @Date 2024/10/17 11:19
 */

@Repository
public class DeptListRedisDAO {

    // Redis key 的常量
    private static final String CONTRACT_DEPT_TYPE_PREFIX = "all";

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private ObjectMapper objectMapper; // 用于序列化和反序列化 JSON

    private static final Random RANDOM = new Random();

    /**
     * 缓存部门信息，并设置过期时间为1到12小时之间的随机小时
     * @param deptList 部门列表
     */
    public void cacheDeptList(List<DeptSimpleDTO> deptList,Long tenantId) throws JsonProcessingException {
        String key = RedisKeyConstants.DEPT +tenantId+ CONTRACT_DEPT_TYPE_PREFIX;

        // 将部门信息序列化为 JSON 字符串
        String deptListJson = objectMapper.writeValueAsString(deptList);

        // 生成 1 到 12 小时之间的随机数
        int randomHours = RANDOM.nextInt(12) + 1; // 生成 1 到 12 小时之间的随机数
        Duration expirationTime = Duration.ofHours(randomHours);

        // 存储到 Redis 并设置过期时间
        stringRedisTemplate.opsForValue().set(key, deptListJson, expirationTime);
    }

    /**
     * 从缓存中获取部门信息
     * @return 部门信息列表
     */
    public List<DeptSimpleDTO> getDeptListFromCache(Long tenantId) throws JsonProcessingException {
        String key = RedisKeyConstants.DEPT +tenantId+ CONTRACT_DEPT_TYPE_PREFIX;
        // 从 Redis 获取缓存的部门信息
        String deptListJson = stringRedisTemplate.opsForValue().get(key);
        if (deptListJson == null) {
            return null; // 没有缓存，返回 null
        }
        // 反序列化 JSON 为 List
        return objectMapper.readValue(deptListJson, new TypeReference<List<DeptSimpleDTO>>() {});
    }

    /**
     * 删除缓存的部门信息
     */
    public void deleteDeptListCache(Long tenantId) {
        String key = RedisKeyConstants.DEPT +tenantId+ CONTRACT_DEPT_TYPE_PREFIX;
        if (Boolean.TRUE.equals(stringRedisTemplate.hasKey(key))) {
            stringRedisTemplate.delete(key);
        }
    }

}